package com.aqie.demo.npe;

import com.aqie.demo.bean.StaffType;
import com.aqie.demo.bean.User;
import com.google.common.base.Enums;

import java.util.*;

/**
 * @author: aqie
 * @create: 2020-12-26 20:34
 **/
public class GeneralException {
    public static class Manager extends User {}

    // 静态 Map 索引, 只有一次循环枚举的过程
    private static final Map<String, StaffType> typeIndex = new HashMap<>(
            StaffType.values().length
    );
    static {
        for (StaffType value : StaffType.values()) {
            typeIndex.put(value.name(), value);
        }
    }

    public static void main(String[] args) {
        // 1. 并发修改异常
        ArrayList<User> users = new ArrayList<User>(
                Arrays.asList(new User("qinyi"), new User("imooc"))
        );
        concurrentModificationException(users);

        // 2. 类型转换异常
        User user1 = new Manager();
        System.out.println(user1.getClass().getName());
        System.out.println(user1 instanceof Manager);


        // 3. 枚举查找异常
        System.out.println(enumFind("RD"));
        System.out.println(enumFind("abc"));

    }

    private static void concurrentModificationException(ArrayList<User> users) {
        // 直接使用 for 循环会触发并发修改异常  fail fast
        /*for (User user : users) {
            if (user.getName().equals("imooc")) {
                users.remove(user);
            }
        }*/

        // users.removeIf(user -> user.getName().equals("imooc"));

        // 使用迭代器则没有问题
        Iterator<User> iter = users.iterator();
        while (iter.hasNext()) {
            User user = iter.next();
            if (user.getName().equals("imooc")) {
                iter.remove();
            }
        }
    }

    private static StaffType enumFind(String type) {
        // IllegalArgumentException
        // return StaffType.valueOf(type);
        // return typeIndex.get(type);
        // 4. 使用 Google Guava Enums, 需要相关的依赖
        return Enums.getIfPresent(StaffType.class, type).orNull();
    }


}
